﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Bussiness;
using Data;

namespace hostal
{
    public partial class EditarHospedaje : Form
    {
        private string numeroHabitacion,numeroHabitacionAntigua, fechaLlegada, numeroDocumento, fechaRegistro, fechaRegistroActual;
        bool click,registro = false;
        bool fechaIngresoIncorrecto,fechaSalidaIncorrecto = true;
        private DataTable dataTableTemporal = new DataTable();
        private manejadorReservas habitacionesDisponibles = new manejadorReservas();
        private manejadorFechas fechas = new manejadorFechas();
        public List<string> coleccionHabitacionesDisponibles { get; set; }
        public List<string> coleccionCapacidadHabitacionesDisponibles { get; set; }
        public List<string> coleccionHabitacionesDisponiblesTodas { get; set; }
        public List<string> coleccionCapacidadHabitacionesDisponiblesTodas { get; set; }

        public EditarHospedaje(string numeroDocumento, string fechaLlegada, string fechaSalida, string fechaRegistro,string numeroHabitacion)
        {
            InitializeComponent();

            habitacionDataAccess habitaciones = new habitacionDataAccess();
            dataTableTemporal = habitaciones.buscartipoHabitaciones();
            dg.DataSource = dataTableTemporal;

            for (int i = 0; i < dg.RowCount; i++)
            {
                CBTipoHabitacion.Items.Add(dg.Rows[i].Cells["tipo"].Value);
            }
            CBTipoHabitacion.Text = CBTipoHabitacion.Items[0].ToString();

            this.numeroDocumento = numeroDocumento;
            numeroHabitacionAntigua = numeroHabitacion;
            this.fechaRegistro = fechaRegistro;
            this.fechaLlegada = fechaLlegada;
            this.numeroHabitacion = numeroHabitacion;
            fechaRegistroActual = fechas.crearFechaActual();
            DTFechaIngreso.Text = fechaLlegada;
            DTFechaSalida.Text = fechaSalida;

            LBHabitacionAntigua.Text += numeroHabitacion;
            DGHabitacionesDisponibles.Columns.Add("numero", "numero habitacion");
            DGHabitacionesDisponibles.Columns.Add("tipo", "tipo");
            DGHabitacionesDisponibles.Columns.Add("capacidad", "capacidad");
            DGHabitacionesDisponibles.Columns.Add("disponible", "disponible");

            HospedajeDataAccess cancelarHospedaje = new HospedajeDataAccess();
            cancelarHospedaje.cancelarHospedaje(numeroHabitacion, numeroDocumento, fechaLlegada);

            llenarGridHabitacionesDisponibles(fechaLlegada, fechaSalida);

            DGHabitacionesDisponibles.ClearSelection();

            for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; i++)
            {
                if (DGHabitacionesDisponibles.Rows[i].Cells["numero"].Value.ToString() == numeroHabitacion)
                    DGHabitacionesDisponibles.Rows[i].Cells["numero"].Selected=true;
            }


            ClienteDataAccess buscarCliente = new ClienteDataAccess();
            dataTableTemporal = buscarCliente.buscarDatos(numeroDocumento);
            DGCliente.DataSource = dataTableTemporal;
        }

        private void llenarGridHabitacionesDisponibles(string fechaIngreso, string fechaSalida)
        {
            try
            {

                coleccionHabitacionesDisponibles = habitacionesDisponibles.obtenerHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);
                coleccionCapacidadHabitacionesDisponibles = habitacionesDisponibles.obtenerCapacidadHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);
                coleccionHabitacionesDisponiblesTodas = habitacionesDisponibles.obtenerHabitacionesDisponiblesTodas(CBTipoHabitacion.Text);
                coleccionCapacidadHabitacionesDisponiblesTodas = habitacionesDisponibles.obtenerCapacidadHabitacionesDisponiblesTodas(CBTipoHabitacion.Text);

                /*if (!coleccionHabitacionesDisponibles.Contains(numeroHabitacion))
                {
                    DGHabitacionesDisponibles.Rows.Add(numeroHabitacion, CBTipoHabitacion.Text);
                }*/
                for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; )
                {
                    DGHabitacionesDisponibles.Rows.Remove(DGHabitacionesDisponibles.Rows[0]);
                }
                for (int i = 0; i < coleccionHabitacionesDisponiblesTodas.Count(); i++)
                {
                    if (coleccionHabitacionesDisponibles.Contains(coleccionHabitacionesDisponiblesTodas[i]))
                        DGHabitacionesDisponibles.Rows.Add(coleccionHabitacionesDisponiblesTodas[i], CBTipoHabitacion.Text, coleccionCapacidadHabitacionesDisponiblesTodas[i], "Libre");
                    else
                        DGHabitacionesDisponibles.Rows.Add(coleccionHabitacionesDisponiblesTodas[i], CBTipoHabitacion.Text, coleccionCapacidadHabitacionesDisponiblesTodas[i], "Ocupada");
                }
                /*if (!coleccionHabitacionesDisponibles.Contains(numeroHabitacion))
                {
                    habitacionDataAccess obtenerCapacidad= new habitacionDataAccess();
                    DGHabitacionesDisponibles.Rows.Add(numeroHabitacion, CBTipoHabitacion.Text,obtenerCapacidad.obtenerCapacidad(numeroHabitacion));
                }*/
            }
            catch (SystemException exp) { }
        }

        private void BTAtras_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void EditarHospedaje_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!registro)
            {
                HospedajeDataAccess activarHospedaje = new HospedajeDataAccess();
                activarHospedaje.habilitarHospedaje(numeroHabitacion, numeroDocumento, fechaLlegada);
            }
        }

        private void BTBuscarCliente_Click(object sender, EventArgs e)
        {
            BuscarClienteReserva buscarClienteReserva = new BuscarClienteReserva();
            string numeroDocumento;
            if (buscarClienteReserva.ShowDialog() == DialogResult.OK)
            {
                numeroDocumento = buscarClienteReserva.numeroDocumento;
                ClienteDataAccess buscarCliente = new ClienteDataAccess();
                dataTableTemporal = buscarCliente.buscarDatos(numeroDocumento);
                DGCliente.DataSource = dataTableTemporal;
            }
        }

        private void BTAgregarHuesped_Click(object sender, EventArgs e)
        {
            registarCliente registrarClienteReserva = new registarCliente();
            registrarClienteReserva.ShowDialog();
        }

        private void BTFinalizar_Click(object sender, EventArgs e)
        {
            if (fechaIngresoIncorrecto = DTFechaIngreso.Value > System.DateTime.Today.Date)
                EPFechaIngreso.SetError(DTFechaIngreso, "La fecha de ingreso no puede ser mayor a la actual");
            else
                EPFechaIngreso.Clear();
            if (fechaSalidaIncorrecto = DTFechaIngreso.Value > DTFechaSalida.Value)
                EPFechaSalida.SetError(DTFechaSalida, "La fecha de salida no puede ser menor a la ingreso");
            else
                EPFechaSalida.Clear();
            if(!fechaSalidaIncorrecto && !fechaIngresoIncorrecto)
            {
                HospedajeDataAccess hospedaje = new HospedajeDataAccess();
                ConsumoDataAccess consumo = new ConsumoDataAccess();

                try
                {
                    int fila;
                    fila = DGCliente.CurrentRow.Index;

                    fila = DGHabitacionesDisponibles.CurrentRow.Index;
                    numeroHabitacion = DGHabitacionesDisponibles.Rows[fila].Cells["numero"].Value.ToString();
                    for (int i = 0; i < DGCliente.Rows.Count; i++)
                    {
                        numeroDocumento = DGCliente.Rows[i].Cells["numeroDocumento"].Value.ToString();
                        if (!hospedaje.existeHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, fechaRegistro))
                            hospedaje.registrarHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistro);
                        else
                            hospedaje.activarHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistro, fechaRegistro);
                    }
                  
                    MessageBox.Show("Exito Al Registrar");
                    registro = true;

                    if (hospedaje.buscarHospedajeUnico(numeroHabitacionAntigua))
                        consumo.actualizarConsumo(numeroHabitacionAntigua, numeroHabitacion);

                    this.Close();
                }
                catch (SystemException exeption)
                {
                    if (DGCliente.Rows.Count == 0)
                        MessageBox.Show("Debe existir al menos una persona parta registrar");
                    else
                        MessageBox.Show("No se Registro Con Exito");
                }
            }
        }

        private void DTFechaIngreso_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);     
        }

        private void DTFechaSalida_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void TBBuscarHabitacionesDisponibles_Click(object sender, EventArgs e)
        {
            if (DTFechaIngreso.Value.Date <= DTFechaSalida.Value.Date)
                llenarGridHabitacionesDisponibles(DTFechaIngreso.Text, DTFechaSalida.Text);
            /*else
                MessageBox.Show("La fecha de salida no puede ser menor a la de ingreso");*/
        }

        private void DTFechaIngreso_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaSalida_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void CBTipoHabitacion_SelectionChangeCommitted(object sender, EventArgs e)
        {
            click = true;
        }

        private void CBTipoHabitacion_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }

        private void CBTipoHabitacion_SelectedValueChanged(object sender, EventArgs e)
        {
            if(click)
                TBBuscarHabitacionesDisponibles_Click(sender, e);
        }
    }
}
